// 作业：
//   定义一个图形接口IShape，声明两个方法，getArea():number和getPer():number。
//   定义矩形类，使用长和宽构造矩形，并实现IShape接口
//   定义三角形类，使用三条边构造三角形（选做：构造时如果三条边不能构造出三角形，抛出异常），并实现IShape接口
//   定义圆形类，使用半径构造圆形，并实现IShape接口

interface IShape {

    getArea():number,

    getPer:()=>number,

}

class Rectangle implements IShape {

    private width: number;

    private height: number;

    constructor(width: number, height: number) {
        this.width = width;
        this.height = height;
    }

    getArea(): number {
        return this.width * this.height
    }
    getPer(): number {
        return 2 * (this.width + this.height)
    }
}
class Triangle implements IShape {

    private a: number;

    private b: number;

    private c: number;

    constructor(a: number, b: number, c: number) {
        if (a + b < c
            || b + c < a
            || a + c < b) {
                throw new Error("三角形两边之和大于第三边");
            }
        this.a = a;
        this.b = b;
        this.c = c;
    }

    getArea(): number {
        let p:number = this.getPer() / 2;
        let r = (p - this.a) * (p - this.b) * (p - this.c) * p
        return Math.pow(r,0.5);
    }

    getPer(): number {
        return this.a + this.b + this.c;
    }

}

class Circle implements IShape {


    private r: number;

    constructor(r: number) {
        this.r = r;
    }

    getArea(): number {
        return this.r * this.r * Math.PI;
    }

    getPer(): number {
        return 2 * this.r * Math.PI;
    }
}

let array:IShape[] = [];
array.push(new Rectangle(10,20));
array.push(new Triangle(3,4,5));
array.push(new Circle(10));

// 定义一个方法，传入图形接口数组，返回二位长的元组，元组第一位为图形的面积和，第二位为图形的周长和
function getIShape(array:IShape[]):[number,number] {
    let r:[number,number] = [0,0];
    array.forEach(v => {
        r[0] += v.getArea();
        r[1] += v.getPer();
    })
    return r;
}

let r:[number,number] = getIShape(array);
console.log(r);